package org.dllwh.mongodb;

import com.mongodb.client.result.UpdateResult;
import jakarta.annotation.Resource;
import org.dllwh.mongodb.model.SysUser;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.ArrayList;
import java.util.List;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName UpdateTest
 * @Description MongoTemplate 更新操作测试类
 * @Author: <a href="mailto:duleilewuhen@sina.com">独泪了无痕</a>
 * @Date 2025-05-10 00:25
 * @版本 V 1.0.1
 * @since JDK 17
 */
@SpringBootTest
public class UpdateTest {
    @Resource
    private MongoTemplate mongoTemplate;
    private final String collectionName = "UpdateTest";

    @BeforeEach
    void init() {
        // 删除集合
        mongoTemplate.dropCollection(collectionName);
        List<SysUser> sysUserList = new ArrayList<>();
        sysUserList.add(SysUser.builder().id("ID10001").name("Tom").age(34).gender("男").build());
        sysUserList.add(SysUser.builder().id("ID10002").name("Tony").age(23).gender("男").build());
        sysUserList.add(SysUser.builder().id("ID10003").name("Ross").age(44).gender("女").build());
        sysUserList.add(SysUser.builder().id("ID10004").name("Gloria").age(14).gender("女").build());
        sysUserList.add(SysUser.builder().id("ID10005").name("Linda").age(24).gender("女").build());
        sysUserList.add(SysUser.builder().id("ID10006").name("regina").age(26).gender("女").build());
        sysUserList.add(SysUser.builder().id("ID10007").name("John").age(22).gender("男").build());
        sysUserList.add(SysUser.builder().id("ID10008").name("Michael").age(22).gender("男").build());
        mongoTemplate.save(sysUserList, collectionName);
    }

    /**
     * 更新文档，匹配查询到的文档数据中的第一条数据
     */
    @Test
    public void updateFirstTest() {
        // 更新条件
        Query query = new Query(Criteria.where("_id").is("ID10001"));
        System.out.println("更新前" + mongoTemplate.find(query, SysUser.class,collectionName));
        Update update = new Update();
        // 更新值
        update.set("name", "张三");
        update.set("sex", "男");
        // 更新查询满足条件的文档数据（第一条）
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, SysUser.class, collectionName);
        System.out.println(updateResult);
    }

    /**
     * 更新文档，匹配查询到的文档数据中的所有数据
     */
    @Test
    public void updateMultiTest() {
        // 更新条件
        Query query = new Query(Criteria.where("age").gte(30));
        // 更新值
        Update update = Update.update("age", 33);
        // 更新查询满足条件的文档数据（全部）
        mongoTemplate.updateMulti(query, update, SysUser.class, collectionName);
    }

    @Test
    public void upsertTest() {
        Query query = new Query(Criteria.where("age").gte(60));
        Update update = Update.update("age", -1);
        mongoTemplate.upsert(query, update, SysUser.class, collectionName);
    }

    @Test
    public void findAndModifyTest() {
        Query query = new Query(Criteria.where("_id").is("ID10001"));
        Update update = Update.update("name", "张三");
        mongoTemplate.findAndModify(query, update, SysUser.class, collectionName);
    }
}
